#ifndef __DEVICE_H__
#define __DEVICE_H__

#include "dlist.h"
#include "comm.h"

typedef struct dev_info
{
	int max_id;
	int dev_num;
} dev_info_t;

// 设备的数据结构
typedef struct device
{
	// 自动维护的数据，用户不对其进行设置和修改
	int dev_id; // 设备号，如10001；
	int dev_order; // 设备序号
	char dev_status; // 设备工作状态，如0：OFF；1：ON
	float cur_value; // 设备当前值

	// 用户可以设置和修改的项目
	char dev_name[32]; // 设备名，如kitchen_light,room_atrconditioning
	char dev_type[32]; // 设备类型，如switch,led
	char dev_ip[16]; // 设备IPv4型，如IP：192.168.31.125
	float dev_power; // 设备额定功率，如60W
} device_t;

typedef int (*cmpfun_t)(const void *data1, const void *data2);
typedef int (*update_fun_t)(void *data1, void *data2);
typedef void (*showfun_t)(const void *data);

int g_modify_flag;
int g_dev_id_min;
int g_dev_num;
node_t *g_list_head;

// ID生成器，新建设备时，根据g_dev_id_min来完成
int generate_id();
// 详细显示
void showfun_dev_full(const void *data);
// 根据id值进行比较
int cmpfun_dev_id(const void *data1, const void *data2);
// 根据设备名进行比较
int cmpfun_dev_name(const void *data1, const void *data2);
// 根据类型进行比较
int cmpfun_dev_type(const void *data1, const void *data2);
// 将new_name中对应的名字修改到old_name中
int updatefun_dev_name(void *old_name, const void *new_name);
// 将new_type中对应的类型修改到old_type中
int updatefun_dev_type(void *old_type, const void *new_type);
// 将new_ip中对应的ip修改到old_ip中
int updatefun_dev_ip(void *old_ip, const void *new_ip);
// 数据链表操作函数，从文件中读取到程序中，形成数据链表
node_t *load_dev();
// 将当前链表数据保存到文件中，持久存储
int save_dev(node_t *head);
// 添加设备
int add_dev(node_t *head, const device_t *new_dev);
// 查找，注意：返回的是一个新的链表，使用完毕需要删除
node_t *find_dev(node_t *head, cmpfun_t cmpfun, const device_t *cmpdev);
// 根据提供的比较方法删除
int del_dev(node_t *head, cmpfun_t cmpfun, const device_t *delete_dev);
// 更新，只根据id查找设备，随后修改
node_t *update_dev(
		node_t *head, 
		int id, 
		update_fun_t update_fun,
		device_t *update_dev);
// 根据提供的排序方法排序
int sort_dev(node_t *head, cmpfun_t cmpfun);
// 根据提供的显示方式显示
void show_dev(node_t *head, showfun_t showfun);

#endif
